//
//  MergeTrees.swift
//  LeetCodeDemo
//
//  Created by OS on 2022/6/15.
//

import Foundation

/*
 617. 合并二叉树
 
 给你两棵二叉树： root1 和 root2 。

 想象一下，当你将其中一棵覆盖到另一棵之上时，两棵树上的一些节点将会重叠（而另一些不会）。你需要将这两棵树合并成一棵新二叉树。合并的规则是：如果两个节点重叠，那么将这两个节点的值相加作为合并后节点的新值；否则，不为 null 的节点将直接作为新二叉树的节点。

 返回合并后的二叉树。

 注意: 合并过程必须从两个树的根节点开始。
 */


class MergeTrees {
    
    /*
     可以使用深度优先搜索合并两个二叉树。从根节点开始同时遍历两个二叉树，并将对应的节点进行合并。

     两个二叉树的对应节点可能存在以下三种情况，对于每种情况使用不同的合并方式。

     如果两个二叉树的对应节点都为空，则合并后的二叉树的对应节点也为空；

     如果两个二叉树的对应节点只有一个为空，则合并后的二叉树的对应节点为其中的非空节点；

     如果两个二叉树的对应节点都不为空，则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和，此时需要显性合并两个节点。

     对一个节点进行合并之后，还要对该节点的左右子树分别进行合并。这是一个递归的过程。
     */
    
    func mergeTrees(_ root1: TreeNode?, _ root2: TreeNode?) -> TreeNode? {
        if root1 == nil {
            return root2
        }
        if root2 == nil {
            return root1
        }
        let merged = TreeNode(root1!.val + root2!.val)
        merged.left = mergeTrees(root1?.left, root2?.left)
        merged.right = mergeTrees(root1?.right, root2?.right)
        return merged
    }
}
